//////////////////////////////////////////////////////////////

//SOURCE FILE: manejo_disco.c

//PROCESO PLANIFICADOR DE DISCO

//Autor: Pablo Bergna

//////////////////////////////////////////////////////////////
#include "includes/todo_incluido.h"
#include "../includes/manejo_disco.h"
#include "includes/tipos_disco.h"


/***********************************************************************
FUNCION: ELIMINAR_DISCO

PROCESO: PPD

Autor: Pablo Bergna

PRE: mi_disco ya creado y alocado en memoria

POST: mi_disco liberado de memoria

DEVUELVE:

FUNCION PPAL: libera la estructura de memoria td_disco
***********************************************************************/


void eliminar_disco(td_disco* mi_disco){
	free(mi_disco->chs_conf);
	free(mi_disco->current_chs);
	fclose(mi_disco->disco);
	free(mi_disco);
}


/***********************************************************************
FUNCION: CREAR_DISCO

PROCESO: PPD

Autor: Pablo Bergna

PRE: *mi_disco ya creado pero sin memoria

POST: *mi_disco alocado en memoria con toda sus estructuras
	SI HUBO ALGUN ERROR LIBERA TODO EL ESPACIO PREVIAMENTE ALOCADO!

DEVUELVE: 0 si salio todo bien
		  -1 si hubo error en algun malloc

FUNCION PPAL: aloca memoria para todas las estructuras de td_disco
***********************************************************************/

int crear_disco(td_disco* mi_disco){
	mi_disco = (td_disco*)malloc(sizeof(td_disco));
	if (!(mi_disco)){//si sale mal
			return -1;
	}
	//si sale bien
	(mi_disco->current_chs) = (td_chs*)malloc(sizeof(td_chs));
	if (!(mi_disco->current_chs)){
			free(mi_disco);
			return -1;
	}
	//si sale bien
	(mi_disco->chs_conf) = (td_chs*)malloc(sizeof(td_chs));
	if (!(mi_disco->chs_conf)){
		free(mi_disco->current_chs);
		free(mi_disco);
		return -1;
	}
	//si salio todo bien
	return 0;
}

/***********************************************************************
FUNCION: ABRIR_DISCO

PROCESO: PPD

Autor: Pablo Bergna

PRE:

POST: disco contiene el puntero al archivo abierto

DEVUELVE: 0 si salio bien
		  -1 si hubo error en apertura

FUNCION PPAL: abre un archivo disco
***********************************************************************/

int abrir_disco(char path[50],FILE* disco){
	int err;

	disco = fopen(path,"r+");
	if (disco){
		err=posix_fadvise((int)(disco),0,0,POSIX_FADV_SEQUENTIAL);
		if (err==-1){
			fclose(disco);
			return -1;
		}
		return 0;//salio bien
	}else{
		return -1;//salio mal
	}
}


/***********************************************************************
FUNCION: POSICIONAR_ARCHIVO

PROCESO: PPD

Autor: Pablo Bergna

PRE: disco ya existe y tiene datos (apunta a un archivo real)
	posicion esta dentro del archivo (no cae fuera)

POST: si sale bien el archivo queda posicionado

DEVUELVE: 0 si salio todo bien
		  -1 si hubo error en el lseek

FUNCION PPAL: mueve el puntero del archivo a la posicion deseada para leer o escribir
***********************************************************************/

int posicionar_archivo(FILE * disco,int posicion){

	off_t offset = lseek((int32_t)disco, (posicion*TAM_SECTOR), SEEK_SET);

	if (offset == -1) return -1;//ERROR DE LSEEK

	return 0;
}
